const cheerio = require('cheerio');
const { Compiler, Compilation, Stats } = require('webpack');
// 18.17 可能需要node 18.17 版本
class MyPlugin {
    constructor() {

    }
    apply(compiler) {
        let startTime;
        compiler.hooks.beforeRun.tap('MyPlugin', () => {
            // 根据 webpack.config.js 的mode 改变 process.env.NODE_ENV 的值
            // 用途：用于检查环境变量、验证配置文件是否完整等前置准备工作
            console.log('beforeRun');
            const mode = compiler.options.mode
            const env = process.env.NODE_ENV;
            if (env !== 'production' && env !== 'development') {
                // console.warn('NODE_ENV should be either "production" or "development". Setting it to "development".');
                process.env.NODE_ENV = mode;
            }
        });
        compiler.hooks.run.tap('MyPlugin', () => {
            // 用途：记录构建开始时间，或者进行一些初始化操作，这些操作不需要等待编译对象创建

            startTime = Date.now();

            console.log('run Webpack构建开始');
        });

        compiler.hooks.emit.tap('MyPlugin', (compilation) => {
            // 遍历所有输出的文件资源
            Object.keys(compilation.assets).forEach((file) => {
                if (file.endsWith('.html')) {
                    const asset = compilation.assets[file];
                    //  content 是当前html 页面里的所有内容
                    const content = asset.source();
                    // // 使用cheerio加载HTML内容，类似在浏览器中操作DOM
                    const $ = cheerio.load(content);
                    // 找到所有空的div元素并删除它们
                    $('div:empty').each((index, element) => {
                        if ($(element).attr('id') !== 'app') {
                            $(element).remove();
                        }
                    });
                    // 将注释去掉
                    $('*').contents().each((i, element) => {
                        if (element.type === 'comment') {
                            $(element).remove();
                        }
                    });
                    const newContent = $.html().replace(/\n\s*\n/g, '\n');
                    // compilation.assets[file] = {
                    //     // source: () => $.html(),
                    //     // size: () => Buffer.from($.html()).length
                    //     source: () => newContent,
                    //     size: () => Buffer.from(newContent).length
                    // };
                    compilation.emitAsset(file, {
                        source: () => newContent,
                        size: () => Buffer.from(newContent).length
                      });
                }
            });
        });

        compiler.hooks.done.tap('MyPlugin', (stats) => {
            const endTime = Date.now();
            const duration = endTime - startTime;
            console.log(`Webpack构建完成，耗时 ${duration}ms。`);
            // 可以在这里进一步处理stats对象，获取构建的详细信息
        });
    }
}

module.exports = MyPlugin;